// package com.renzhebiao.lkang.utils;
//
// import java.util.Date;
// import java.util.Map;
//
// import org.apache.commons.lang3.time.DateUtils;
// import org.springframework.beans.factory.annotation.Value;
// import org.springframework.stereotype.Component;
//
// import com.alibaba.druid.util.StringUtils;
// import com.alibaba.fastjson.JSONArray;
// import com.renzhebiao.lkang.exception.ForbiddenException;
//
// import io.jsonwebtoken.Claims;
// import io.jsonwebtoken.Header;
// import io.jsonwebtoken.JwsHeader;
// import io.jsonwebtoken.JwtBuilder;
// import io.jsonwebtoken.Jwts;
// import io.jsonwebtoken.SignatureAlgorithm;
// import io.jsonwebtoken.impl.DefaultClaims;
// import io.jsonwebtoken.impl.DefaultJwsHeader;
// import io.jsonwebtoken.impl.TextCodec;
// import lombok.extern.log4j.Log4j;
//
// @Log4j
// @Component
// public class JWTUtil {
//
// @Value("${jwt.secret}")
// private String secret;
// @Value("${jwt.expDateMs}")
// private Integer expDateMs;
//
// // 默认加密方式
// private static final SignatureAlgorithm SIGNATUREALGORITHM = SignatureAlgorithm.HS256;
//
// // token中用户信息的key
// private static final String USER_INFO_KEY = "userInfo";
//
// /***
// * 创建jwt header
// *
// * @param signatureAlgorithm:加密方式
// * @return
// */
// public JwsHeader getJWTHeader(SignatureAlgorithm signatureAlgorithm) {
// if (signatureAlgorithm == null) signatureAlgorithm = SIGNATUREALGORITHM;
// JwsHeader jwsHeader = new DefaultJwsHeader();
// jwsHeader.setAlgorithm(signatureAlgorithm.getValue());
// jwsHeader.setType(Header.JWT_TYPE);
// return jwsHeader;
// }
//
// /***
// * @return
// */
// public JwsHeader getJWTHeader() {
// return getJWTHeader(null);
// }
//
// /***
// * 创建jwt 指定头信息 指定申明
// *
// * @param header
// * @param claims
// * @param userModel
// * @return
// */
// public String createJWT(Header header, Claims claims, Map<String, Object> map) {
// JwtBuilder builder = Jwts.builder();
// builder.setHeaderParams(header);
// if (!map.isEmpty()) {
// for (Map.Entry<String, Object> entry : map.entrySet()) {
// // System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
// claims.put(entry.getKey(), entry.getValue());
// }
// }
// // 设置自定义申明
// if (claims != null && !claims.isEmpty()) {
// builder.setClaims(claims);
// }
// builder.signWith(SIGNATUREALGORITHM, getBase64EncodedKey(getTokenSecret()));
// return builder.compact();
// }
//
// /***
// * 指定加密方式指定申明
// *
// * @param signatureAlgorithm
// * @param claims
// * @param userModel
// * @return
// */
// public String createJWT(SignatureAlgorithm signatureAlgorithm, Claims claims, Map<String, Object> map) {
// return createJWT(getJWTHeader(signatureAlgorithm), claims, map);
// }
//
// /***
// * 指定加密方式
// *
// * @param signatureAlgorithm
// * @param userModel
// * @return
// */
// public String createJWT(SignatureAlgorithm signatureAlgorithm, Map<String, Object> map) {
// return createJWT(signatureAlgorithm, getDefaultClaims(), map);
// }
//
// /***
// * 使用默认加密方式,指定申明
// *
// * @param claims
// * @param userModel
// * @return
// */
// public String createJWT(Claims claims, Map<String, Object> map) {
// return createJWT(getJWTHeader(), claims, map);
// }
//
// /***
// * 使用默认申明,默认加密方式创建jot
// *
// * @param userModel
// * @return
// */
// public String createJWT(Map<String, Object> map) {
// return createJWT(getDefaultClaims(), map);
// }
//
// /***
// * 获取申明
// *
// * @param exp:过期时间
// * @param nbfDate:生效时间
// * @param iss:签发者
// * @param sub:面向用户
// * @param aud:接收的一方
// * @return
// */
// public Claims getClaims(Date issAt, Date exp, Date nbfDate, String iss, String sub, String aud) {
// Claims claims = new DefaultClaims();
// // 设置签发时间
// if (issAt != null) {
// claims.setIssuedAt(issAt);
// }
// // 设置过期时间
// if (exp != null) {
// claims.setExpiration(exp);
// }
// // 设置生效时间
// if (nbfDate != null) {
// claims.setNotBefore(nbfDate);
// }
// // 设置签发者
// if (!StringUtils.isEmpty(iss)) {
// claims.setIssuer(iss);
// }
// // 设置该token面向的用户
// if (!StringUtils.isEmpty(sub)) {
// claims.setSubject(sub);
// }
// // 设置接收该token的一方
// if (!StringUtils.isEmpty(aud)) {
// claims.setAudience(aud);
// }
// return claims;
// }
//
// /**
// * 指定过期日期
// *
// * @param expDate
// * @return
// */
// public Claims getClaims(Date expDate) {
// return getClaims(new Date(), expDate, null, null, null, null);
// }
//
// /***
// * 获取默认申明(设置过期时间)
// *
// * @return
// */
// public Claims getDefaultClaims() {
// Date now = new Date();
// // 获取配置的默认过期时间 1天
// // Integer expDays = 1;// DZPropertyConfigurer.getContextProperty(Constants.DZ_TOKEN_EXP_DAY,
// // Integer.class);
// Date expDate = null;
// if (expDateMs != null && expDateMs.intValue() > 0) {
// // 当前时间增加多少毫秒
// expDate = DateUtils.addSeconds(now, expDateMs);
// } else {
// // 如果过期时间为null 则默认为一天
// expDate = DateUtils.addHours(now, 1);
// }
// return getClaims(now, expDate, null, null, null, null);
// }
//
// /**
// * 返回创建时间
// *
// * @param token
// * @return
// */
// public Date getCreatedDateFromToken(String token) {
// Date created;
// try {
// final Claims claims = getClaimsFromToken(token);
// created = claims.getIssuedAt();
// // created = new Date((Long) claims.get(Claims.ISSUED_AT));
// } catch (Exception e) {
// created = null;
// }
// return created;
// }
//
// /**
// * 返回过期时间
// *
// * @param token
// * @return
// */
// public Date getExpirationDateFromToken(String token) {
// Date expiration;
// try {
// final Claims claims = getClaimsFromToken(token);
// expiration = claims.getExpiration();
// } catch (Exception e) {
// expiration = null;
// }
// return expiration;
// }
//
// /**
// * 解密 jwt
// *
// * @param jwt
// * @return
// * @throws Exception
// */
// public Claims getClaimsFromToken(String token) {
// // Claims claims =
// // Jwts.parser().setSigningKey(getBase64EncodedKey(getTokenSecret())).parseClaimsJws(jwt).getBody();
// if (EmptyTools.isNullOrEmpty(token)) {
// throw new ForbiddenException(40301, "无效的令牌");
// }
// Claims claims = null;
// try {
// claims = Jwts.parser().setSigningKey(getTokenSecret()).parseClaimsJws(token).getBody();
// } catch (Exception e) {
// log.error("解密token错误,错误原因:" + e.getMessage());
// throw new ForbiddenException(40301, "token无效");
// }
// return claims;
// }
//
// /***
// * 获取系统配置的token签名秘钥
// *
// * @return
// */
// public String getTokenSecret() {
// // System.out.println(secret);
// if (EmptyTools.isNullOrEmpty(secret)) {
// return "secret";
// }
// return this.secret;
// }
//
// public Long getIdFromToken(String token) {
// Claims claims = getClaimsFromToken(token);
// if (EmptyTools.isNotNullOrEmpty(claims)) {
// return (Long) claims.get("id");
// }
// return null;
// }
//
// /***
// * 将secret 用BASE64加密
// *
// * @return
// */
// public String getBase64EncodedKey(String secret) {
//
// return secret == null ? null : TextCodec.BASE64.encode(secret);
// }
//
// public String refreshToken(String token) {
// Long id = getIdFromToken(token);
// return createJWT(new MapUtils().put("id", id));
// }
//
// public static void main(String[] args) {
// JWTUtil jwt = new JWTUtil();
// String token = jwt.createJWT(new MapUtils().put("id", 1));
// System.out.println(token);
// Claims claims = jwt.getClaimsFromToken(token);
// System.out.println(claims.get("id"));
// JSONArray json = new JSONArray();
// json.add(claims);
// System.out.println(json.toJSONString());
// }
//
// }
